package com.cly.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.concurrent.TimeUnit;

@EnableConfigurationProperties(WxMsgProperties.class)
@Configuration
@Slf4j
@Data
public class WxMsgAutoConfiguration {

    @Autowired
    private WxMsgProperties wxMsgProperties;

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 存放token
     * 对象的创建过程
     * 类的 加载 解析 验证 链接
     * 在堆内存分配空间
     * 实例化 让堆中的应用给栈
     * 初始化
     * 被使用
     * 销毁
     */
    private String WX_TOKEN;

    /**
     * spring遵循了这个注解的规范
     * 当bean实例化完成就会执行这个方法
     */
    @PostConstruct
    public void initToken(){
        System.out.println("之前" + new Date());
        try {
            TimeUnit.SECONDS.sleep(5);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("之后" + new Date());
        getWxToken();
    }

    /**
     * 主要获取token的
     * 发微信消息
     * 1.拿到token必须要在发消息之前
     * 分布式任务调度
     */
    @Scheduled(fixedRate = 7100 * 1000)
    private void getWxToken() {
        //获取token 发送token 就是发送get请求
        String tokenUrl = wxMsgProperties.getTokenUrl();
        String authUrl = String.format(tokenUrl, wxMsgProperties.getAppId(), wxMsgProperties.getAppSecret());
        String wxResult = restTemplate.getForObject(authUrl, String.class);
        JSONObject jsonObject = JSON.parseObject(wxResult);
        String accessToken = jsonObject.getString("access_token");
        if (StringUtils.hasText(accessToken)){
            WX_TOKEN = accessToken;
        } else {
            log.error("获取token失败");
        }

    }

}
